import { BadRequestException, Inject, Injectable } from '@nestjs/common';
import {
  Company,
  CompanyModelReturnType,
  createCompanyDto,
  UpdateCompanyDto
} from 'libs/db/src/schemas';
import { QueryDto } from './dto/queryDto';

@Injectable()
export class CompanyService {
  constructor(
    @Inject(Company.name) private readonly conpanyModel: CompanyModelReturnType
  ) {}

  async create(company: createCompanyDto) {
    const { name, busRegistNo } = company;
    const com = await this.conpanyModel.findOne({ name }).exec();
    const com2 = await this.conpanyModel.findOne({ busRegistNo });
    if (!!com || !!com2) {
      throw new BadRequestException('公司已存在,请勿重复添加!');
    }
    return this.conpanyModel.create(company);
  }

  /**
   * 根据查询参数分页查询部门
   * @param dto 查询参数
   * @returns
   */
  async pageQuery(dto: QueryDto) {
    // 解构赋值，从dto中获取limit、page、intro、name、createAt
    const { limit, page, name, leader, dateRange } = dto;
    // 初始化query为空对象
    const query = {} as any;
    // 如果name存在，则将name添加到query中，使用正则表达式进行模糊匹配，不区分大小写
    if (name) {
      query.name = { $regex: name, $options: 'i' };
    }
    // 如果intro存在，则将intro添加到query中，使用正则表达式进行模糊匹配，不区分大小写
    if (leader) {
      query.leader = { $regex: leader, $options: 'i' };
    }
    // 如果createAt存在，则将createAt添加到query中，使用$gte和$lte进行范围查询
    if (dateRange) {
      query.createdAt = {
        $gte: new Date(dateRange[0]),
        $lt: new Date(dateRange[1])
      };
    }
    // 使用aggregate方法进行查询，统计符合条件的总数
    const total = await this.conpanyModel.aggregate([
      {
        $match: query
      },
      {
        $count: 'total'
      }
    ]);
    // 使用aggregate方法进行查询，分页查询
    const list = await this.conpanyModel.aggregate([
      {
        $match: query
      },
      {
        $skip: (page - 1) * limit
      },
      {
        $limit: limit
      }
    ]);
    // 返回查询结果，包括总数和数据
    return {
      total: total[0]?.total || 0,
      list
    };
  }

  findAll() {
    return this.conpanyModel.find().select('-__v').exec();
  }

  findById(id: string) {
    return this.conpanyModel.findById(id);
  }

  findByName(name: string) {
    return this.conpanyModel.find({ name }).select('-__v').exec();
  }

  update(id: string, company: UpdateCompanyDto) {
    // console.log(id, company);
    return this.conpanyModel.findByIdAndUpdate(id, company, {
      new: true,
      runValidators: true
    });
  }

  del(id: string) {
    return this.conpanyModel.findByIdAndDelete(id);
  }
}
